package br.com.pnfp.web.control.actions.cadastros;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.util.StringUtils;

import br.com.pnfp.web.control.actions.DefaultAction;
import br.com.pnfp.web.control.forms.cadastros.CadastroEntidadeForm;
import br.com.pnfp.web.model.enums.SimNao;
import br.com.pnfp.web.model.vo.Doador;
import br.com.pnfp.web.model.vo.Entidade;

public class CadastroEntidadeAction extends DefaultAction {
	
	private static final Logger logger = Logger.getLogger(CadastroEntidadeAction.class);
	
	public ActionForward iniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		return mapping.findForward("body");
	}
	
	public ActionForward consultar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm entidadeForm = (CadastroEntidadeForm) form;
		consultar(entidadeForm, request);
		
		return mapping.findForward("body");
	}
	
	public ActionForward incluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm entidadeForm = (CadastroEntidadeForm) form;
		Entidade vo = new Entidade();
		vo.setCnpj(entidadeForm.getCnpj());
		vo.setCodigoSefaz(new Integer(entidadeForm.getCodigoSefaz()));
		vo.setUsuarioSistema(getUsuario(request));
		
		if(getEntidadeDAO().consultar(vo).size() > 0) {
			printMessage("Login já cadastrado!", response);
		} else {
			vo.setRazaoSocial(entidadeForm.getRazaoSocial());
			
			getEntidadeDAO().incluir(vo);			
		}
		
		return null;
	}	
	
	public ActionForward alterarIniciar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm entidadeForm = (CadastroEntidadeForm) form;
		List<Entidade> lista = getEntidadeDAO().consultar(new Entidade(entidadeForm.getIdSelecionado(),getUsuario(request)));
		 
		Entidade vo = lista.get(0);
		printJsonObjectToStream(vo, response);
		
		return null;
	}	
	
	public ActionForward alterar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm entidadeForm = (CadastroEntidadeForm) form;
		Entidade vo = new Entidade();
		vo.setCodigo(entidadeForm.getIdSelecionado());
		vo.setRazaoSocial(entidadeForm.getRazaoSocial());
		vo.setCodigoSefaz(new Integer(entidadeForm.getCodigoSefaz()));
		getEntidadeDAO().alterar(vo);
		
		return null;
	}
	
	public ActionForward excluir(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm entidadeForm = (CadastroEntidadeForm) form;
		getEntidadeDAO().excluir(entidadeForm.getIdSelecionado());
		
		return mapping.findForward("body");
	}
	
	public ActionForward verificaCNPJ(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm cadastroEntidadeForm = (CadastroEntidadeForm) form;
		Entidade vo = new Entidade();
		vo.setCnpj(cadastroEntidadeForm.getCnpj());
		vo.setUsuarioSistema(getUsuario(request));
		
		List<Entidade> lista = getEntidadeDAO().consultar(vo);
		if(lista.size() > 0) {
			printJsonObjectToStream(lista.get(0), response);
		} else {
			printJsonObjectToStream(new Entidade(), response);
		}
		
		return null;
	}
	
	public ActionForward associar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {		
		
		CadastroEntidadeForm entidadeForm = (CadastroEntidadeForm) form;
		
		Doador doador = new Doador(getUsuario(request));
		if(entidadeForm.getMostrarAssociacao() != null && entidadeForm.getMostrarAssociacao() == 0)
			doador.setAssociado(SimNao.NAO);
		
		List<Doador> doadores = getDoadorDAO().consultar(doador);
		Entidade vo = new Entidade();
		vo.setUsuarioSistema(getUsuario(request));
		List<Entidade> entidades = getEntidadeDAO().consultar(vo);
		for(Entidade entidade : entidades) {
			List<Doador> associados = getEntidadeDAO().consultaDoadorAssociado(entidade);
			entidade.setDoadores(associados);
		}
		
		request.setAttribute("doadores", doadores);
		request.setAttribute("entidades", entidades);
		
		return mapping.findForward("associar");
	}
	
	private void consultar(CadastroEntidadeForm entidadeForm, HttpServletRequest request) {
		Entidade vo = new Entidade();
		vo.setRazaoSocial(entidadeForm.getRazaoSocialConsultar());
		vo.setCnpj(entidadeForm.getCnpjConsultar());
		vo.setUsuarioSistema(getUsuario(request));
		
		List<Entidade> listaResultado = getEntidadeDAO().consultar(vo);
		request.setAttribute("listaResultado", listaResultado);
	}
	
	public ActionForward ajaxListar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		List<Entidade> result = getEntidadeDAO().consultar(new Entidade());		
		printJsonObjectToStream(result, response);
		return null;
	}
		
	public ActionForward associarDoador(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		CadastroEntidadeForm cadastroEntidadeForm = (CadastroEntidadeForm) form;
		String ids[] = StringUtils.delimitedListToStringArray(cadastroEntidadeForm.getAssociar(), "#");
		
		Entidade vo = new Entidade(new Integer(ids[0]));
		vo.setDoadores(new ArrayList<Doador>());
		vo.getDoadores().add(new Doador(new Integer(ids[1])));
		getEntidadeDAO().associarDoador(vo);
		
		return null;
	}

}
